package common

import (
	"bufio"
	"fmt"
	"io"
	neturl "net/url"
	"os"
	"regexp"
)

//Check 需要panic的错误
func Check(e error) {
	if e != nil {
		panic(e)
	}
}

// ExtractString 正则
func ExtractString(
	contents []byte, re *regexp.Regexp) string {
	match := re.FindSubmatch(contents)
	if len(match) >= 2 {
		return string(match[1])
	} else {
		return ""
	}
}

// Encode 编码
func Encode(urlStr string) string {
	return neturl.QueryEscape(urlStr)
}

// Decode解码
func Decode(urlStr string) (string, error) {
	return neturl.QueryUnescape(urlStr)
}

// WriteStringToFile 写入文字到文件
func WriteStringToFile(contents string, filename string) {
	var f *os.File
	var err1 error
	if checkFileIsExist(filename) { //如果文件存在
		f, err1 = os.OpenFile(filename, os.O_APPEND, 0600) //打开文件 写入会覆盖
	} else {
		f, err1 = os.Create(filename) //创建文件
		fmt.Println("文件不存在")
	}
	Check(err1)
	_, error := io.WriteString(f, contents) //写入文件(字符串)
	Check(error)
}

// WriteByteToFile 写入字节到文件
func WriteByteToFile(contents []byte, filename string) {
	var f *os.File
	var err1 error
	if checkFileIsExist(filename) { //如果文件存在
		//f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
		f, err1 = os.OpenFile(filename, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0600)
		fmt.Println("文件存在")
	} else {
		f, err1 = os.Create(filename) //创建文件
		fmt.Println("文件不存在")
	}
	w := bufio.NewWriter(f) //创建新的 Writer 对象
	Check(err1)
	n4, _ := w.WriteString(string(contents))
	fmt.Printf("写入 %d 个字节n", n4)
	w.Flush()
	f.Close()
}

/**
 * 判断文件是否存在  存在返回 true 不存在返回false
 */
func checkFileIsExist(filename string) bool {
	var exist = true
	if _, err := os.Stat(filename); os.IsNotExist(err) {
		exist = false
	}
	return exist
}

// SubstrLen 截取字符串 start 起点下标 length 需要截取的长度
func SubstrLen(str string, start int, length int) string {
	rs := []rune(str)
	rl := len(rs)
	end := 0

	if start < 0 {
		start = rl - 1 + start
	}
	end = start + length

	if start > end {
		start, end = end, start
	}

	if start < 0 {
		start = 0
	}
	if start > rl {
		start = rl
	}
	if end < 0 {
		end = 0
	}
	if end > rl {
		end = rl
	}

	return string(rs[start:end])
}

// SubstrEnd 截取字符串 start 起点下标 end 终点下标(不包括)
func SubstrEnd(str string, start int, end int) string {
	rs := []rune(str)
	length := len(rs)

	if start < 0 || start > length {
		panic("start is wrong")
	}

	if end < 0 || end > length {
		panic("end is wrong")
	}

	return string(rs[start:end])
}
